﻿namespace hercules.Models.Negocio
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    using hercules.Models.Dados;

    /// <summary>
    /// Classe responsável pela lógica de negócio dos vendas.
    /// </summary>
    public class NegocioVenda
    {
        /// <summary>
        /// Objeto genérico que faz a persistência dos dados.
        /// </summary>
        private readonly IRepositorioGenerico<Venda, ControleEstoqueEntities> repositorioVenda;

        /// <summary>
        /// Initializes a new instance of the <see cref="NegocioVenda"/> class.
        /// Construtor para inicializar os atributos.
        /// </summary>
        public NegocioVenda()
        {
            this.repositorioVenda = new RepositorioGenerico<Venda, ControleEstoqueEntities>("chave");
        }

        /// <summary>
        /// Método para fazer a inserção de venda.
        /// </summary>
        /// <param name="venda">Objeto que irá ser persistido</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Inserir(Venda venda)
        {
            this.repositorioVenda.Inserir(venda);
            return this.repositorioVenda.SaveChanges() > 0;
        }

        /// <summary>
        /// Método para fazer a alteração de venda.
        /// </summary>
        /// <param name="objeto">Objeto que terá seus dados alterados</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Editar(Venda objeto)
        {
            Venda venda = this.Obter(objeto.numeroNota);
            venda.funcionario = objeto.funcionario;
            venda.cliente = objeto.cliente;
            venda.modelo = objeto.modelo;
            venda.dataEmissao = objeto.dataEmissao;
            venda.dataSaida = objeto.dataSaida;
            venda.naturezaCFOP = objeto.naturezaCFOP;
            venda.valorTotal = objeto.valorTotal;
            venda.desconto = objeto.desconto;
            venda.quantidade = objeto.quantidade;
            venda.valorUnitario = objeto.valorUnitario;
            venda.valorTotalProduto = objeto.valorTotalProduto;
            venda.statusVenda = objeto.statusVenda;

            return this.repositorioVenda.SaveChanges() > 0;
        }

        /// <summary>
        /// Método para remover um venda utilizando o número da nota da venda.
        /// </summary>
        /// <param name="numNota">Número da nota da venda que será removido.</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Remover(int numNota)
        {
            this.repositorioVenda.Remover(venda => venda.numeroNota == numNota);
            return this.repositorioVenda.SaveChanges() > 0;
        }

        /// <summary>
        /// Método que retorna uma lista com todos os vendas.
        /// </summary>
        /// <returns>A lista com os vendas.</returns>
        public List<Venda> ObterTodos()
        {
            return this.repositorioVenda.ObterTodos().ToList();
        }

        /// <summary>
        /// Método que retorna um venda passando o número da nota.
        /// </summary>
        /// <param name="numNota">Número da nota da venda a ser retornado.</param>
        /// <returns>O venda desejado.</returns>
        public Venda Obter(int numNota)
        {
            return this.repositorioVenda.ObterEntidade(venda => venda.numeroNota == numNota);
        }

        /// <summary>
        /// Método para fazer a comparação entre duas vendas.
        /// </summary>
        /// <param name="venda1">Primeira venda.</param>
        /// <param name="venda2">Segunda venda.</param>
        /// <returns>True se eles forem iguais, caso contrário false.</returns>
        public bool Equals(Venda venda1, Venda venda2)
        {
            if (venda1.numeroNota.Equals(venda2.numeroNota) && 
                venda1.funcionario.Equals(venda2.funcionario) &&
                venda1.cliente.Equals(venda2.cliente) &&
                venda1.modelo.Equals(venda2.modelo) &&
                venda1.dataEmissao.Equals(venda2.dataEmissao) &&
                venda1.dataSaida.Equals(venda2.dataSaida) &&
                venda1.naturezaCFOP.Equals(venda2.naturezaCFOP) &&
                venda1.valorTotal.Equals(venda2.valorTotal) &&
                venda1.desconto.Equals(venda2.desconto) &&
                venda1.quantidade.Equals(venda2.quantidade) && 
                venda1.valorUnitario.Equals(venda2.valorUnitario) && 
                venda1.valorTotalProduto.Equals(venda2.valorTotalProduto) && 
                venda1.statusVenda.Equals(venda2.statusVenda))
            {
                return true;
            }

            return false;
        }
    }
}